﻿// CSVLiner.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>
#include <variant>
#include <qdatetime.h>
#include <qwt_plot.h>
#include <qfile.h>
#include <QtGui>
#include <qwt_plot_panner.h>
#include <qwt_plot_zoomer.h>
#include <QwtDateScaleDraw>
#include <QwtDateScaleEngine>

namespace csv {
	enum DateType { str, number, time };

	class Clomn {
	public:
		Clomn() {
		}
		Clomn(QString f) :format(f) {
			mType = DateType::time;
		}
		~Clomn() {
		}
		void push_back(QString input) {
			switch (mType) {
			case csv::str:
				break;
			case csv::number: data.push_back(input.toDouble());
				break;
			case csv::time: data.push_back(QDateTime::fromString(input, format).toSecsSinceEpoch());
				break;
			default:
				break;
			}
		}

	private:
		DateType mType = DateType::number;
		std::vector<double> data;
		QString format;
	};

	//只关心哪一行跳过，哪一行是表头，哪些列是要绘制的数据，是什么数据，其他一概不管，那些字符串都不管，不处理列标签
	//即使是时间列也存储成数据
	class CsvReader {
	public:
		//输入文件名，分隔符，跳过的行，
		CsvReader(QString fn, QString separator = "\t", unsigned int skip_rows = 0, int labelIdx = 0);
		~CsvReader();
		//设置需要保存数据的行，其中哪些行是时间变量
		void setFliter(const std::vector<unsigned int>&);
		void setFliter(const std::vector<QString>&);

		inline const auto& getHeader() const { return header; }
		//读取一行
		const auto readRow() {
			auto content = readLineRaw();
			return content.size() == header.size() ? content : QStringList();
		}

		inline auto pos() { return mFile.pos(); }
		inline bool	atEnd() { return mFile.atEnd(); }
		const std::vector<double>& operator[](const QString& key) {
			return clomns[header.count(key)];
		}
		const std::vector<double>& operator[](unsigned int key) {
			return clomns[key];
		}
		//列数
		auto clomn() { return header.size(); }
	private:
		QStringList header;
		QString mSep;
		unsigned int mSkipRows;
		QFile mFile;
		//列标签行，在此之前的数据，要么是skip，要么丢弃（是否有点重复）
		// 从0开始计数，小于0表示没有列标签
		int mlabelIdx;
		//读取一行文本，返回去除换行后分割的字符数组
		inline QStringList readLineRaw() {
			return QString::fromLocal8Bit(mFile.readLine()).trimmed().split(mSep);
		}
		//列名不一定存在，所以应该用int索引
		std::map<unsigned int, std::vector<double>> clomns;
	};
	//画图区域，还是使用画图来保存数据，而不是使用csvreadder
	class CsvPlot :public QwtPlot {
		Q_OBJECT
	public:
		CsvPlot();
		~CsvPlot();

		inline void insertData(double x, double y) {
			xdata.append(x);
			ydata.append(x);
		}

	private:
		QwtPlotZoomer* zoomer;
		QwtPlotPanner* panner;

		QVector<double> xdata{
	static_cast<double>(QDateTime::currentDateTime().toMSecsSinceEpoch()),
	static_cast<double>(QDateTime::currentDateTime().toMSecsSinceEpoch()),
	static_cast<double>(QDateTime::currentDateTime().toMSecsSinceEpoch()) };
		QVector<double> ydata{ 1,2,3 };

		QwtDateScaleDraw* draw = new QwtDateScaleDraw(Qt::LocalTime);
		QwtDateScaleEngine* engine = new QwtDateScaleEngine(Qt::LocalTime);
	};
}
